/*	--- 使用ATomic --- 

atomic  adj.  原子的;与原子有关的;原子能的;原子武器的
CAS  =  Compare and Swap  比较并替换
------------------

Java的java.util.concurrent包除了提供【底层锁、并发集合】外，还提供了一组【原子操作的封装类】，它们位于java.util.concurrent.atomic包。

--------

我们以AtomicInteger为例，它提供的主要操作有：

	· 增加值 & 返回新值：int addAndGet(int delta)
	· 加1后 返回新值：int incrementAndGet()
	· 获取当前值：int get()
	· 用CAS方式设置：int compareAndSet(int expect, int update)


【Atomic类】是通过‘无锁（lock-free）’的方式实现的‘线程安全（thread-safe）访问’。它的主要原理是利用了CAS：
	Compare and Set。

如果我们自己通过CAS编写incrementAndGet()，它大概长这样： */
public int incrementAndGet(AtomicInteger var) {
	int prev, next;

	do {
		prev = var.get();
		next = prev + 1;
	} while (! var.compareAndSet(prev, next));

	return next;
}


/*
CAS(Compare And Swap)是指，在这个操作中，如果AtomicInteger的当前值是prev，那么就更新为next，返回true。

如果AtomicInteger的当前值不是prev，就什么也不干，返回false。

通过CAS操作并配合do ... while循环，即使其他线程修改了AtomicInteger的值，最终的结果也是正确的。
(因为：如果other thread操作了prev,那么var.compareAndSet(prev,next)再一次读取到的prev不为var.get(),两次判断,实现无锁的线程同步)

------------------------------

我们利用AtomicLong可以编写一个【多线程安全的全局唯一ID生成器】： */
class IdGenerator {
	AtomicLong var = new AtomicLong(0);

	public long getNextId() {
		return var.incrementAndGet();
	}
}


/*
通常情况下，我们并不需要直接使用do ... while循环调用compareAndSet实现复杂的并发操作

而是用incrementAndGet()这样的封装好的方法，因此，使用起来非常简单。

-----------------------

在高度竞争的情况下，还可以使用Java 8提供的LongAdder和LongAccumulator。

*/




/*-----------------------------------------------

#	---- 使用Atomic の 小结 ---- 

使用java.util.concurrent.atomic提供的【原子操作】可以简化多线程编程：

	· 原子操作实现了无锁的线程安全;

	· 适用于计数器，累加器等。


*/



















